package com.chris.core.socket.netty.handler;

import com.chris.core.socket.netty.dto.protocol.FileMessageProtocol;
import com.chris.core.socket.netty.dto.protocol.CmdObjectProtocol;
import com.chris.core.socket.netty.util.NettyRunTimeUtil;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 对象处理器-- 客户端
 * 注意：此方法仅能 java netty 客户端 对 java netty 服务端
 * 苏斌 2022-3-29
 */
@Deprecated
public class ObjectClientHandler extends ChannelInboundHandlerAdapter {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    /**
     * 当通道就绪
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //super.channelActive(ctx);
        // ctx.writeAndFlush(Unpooled.copiedBuffer("建立链接\r\n", CharsetUtil.UTF_8));
        //ctx.writeAndFlush("客户端建立链接\r\n");
        // ctx.writeAndFlush("ping\r\n");
        // log.info("客户端通道建立就绪 服务端地址:"+ctx.channel().remoteAddress());
       // TransferDataDTO dto = new TransferDataDTO("msg","我是客户端，我上来了!");
       // ctx.writeAndFlush(dto);
    }

    /**
     * 读取服务端发送数据
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // super.channelRead(ctx,msg);
        //注意区别 ：byteBuffer(nio) ByteBuf (netty)
        // ByteBuf byteBuf =(ByteBuf)msg;
        //  log.debug("获取客户端发送数据：" +byteBuf.toString(CharsetUtil.UTF_8));
        // String tip= byteBuf.toString(CharsetUtil.UTF_8);

        //服务端发来  read-ping ,不回复pong , write-ping 回复pong
        // if (msg.equals("write-ping"))
        //     ctx.writeAndFlush("pong\r\n");
        if (msg instanceof byte[]) {
            log.debug("收到字节码：" + ((byte[]) msg).toString());
        } else if (msg instanceof String) {
            log.debug("收到文本：" + msg.toString());
        } else if (msg instanceof CmdObjectProtocol) {
            CmdObjectProtocol dto = (CmdObjectProtocol) msg;
            if (dto.getCode().equals("msg")) {
                log.debug("获取服务端送数据：" + dto.getMsg());
            } else if (dto.getCode().equals("sendfile") || dto.getCode().equals("revicefile")) {
                log.debug("传输文件:" + dto.getMsg());
            }
        } else if (msg instanceof FileMessageProtocol) {

           // if ( ((FileMessageProtocol) msg).getFileData().length>1024*100)
           //     throw  new Exception("接收数据包操作限制");
            // 重负载IO , 异步执行 read 内容, 此处是 只有一个线程运行，并发会排队
            ctx.channel().eventLoop().execute(new Runnable() {
                @Override
                public void run() {
                    NettyRunTimeUtil.doTransfer((FileMessageProtocol) msg, NettyRunTimeUtil.uploadFilePath, ctx.channel());
                }
            });
        }

//传递给下一个pinline
        super.channelRead(ctx,msg);
    }



    /**
     * 异常处理
     * 一般是关闭通道
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        log.debug("客户端通道捕获异常 客户端地址:"+ctx.channel().remoteAddress() +" 问题:"+cause.toString() ) ;
    }

    /**
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        log.debug("客户端下线 地址："+channel.remoteAddress());
    }

}
